package ink.ykb.j2CacheDemo.util;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Component;

@Component
public class HttpRequestLocal {
	
	public  HttpRequestLocal(){
		
	}
	
	  private static final ThreadLocal<HttpServletRequest> requests =
		         new ThreadLocal<HttpServletRequest>() {
		             @Override protected HttpServletRequest initialValue() {
		                 return null;
		         }
		     };
		     
	 public  Object getSessionValue(String attr){
		 return  requests.get().getSession().getAttribute(attr);
	 }
	 
	 public  void setSessionValue(String attr,Object obj){
		   requests.get().getSession().setAttribute(attr,obj);
	 }
	 
	 
	 
	 public  Object getRequestValue(String attr){
		 return  requests.get().getAttribute(attr);
	 }
	 
	 public String getRequestURI(){
		 return  requests.get().getRequestURI();
	 }
	 
	 
	 public  void set(HttpServletRequest request){
		 requests.set(request);
	 }
	 
	 public Integer getUserId() {
		 return  (Integer)getSessionValue(Constant.SESSION_USER_ID);
	 }
	 
	 /**
		 * 获取当前项目的webroot的方法
		 * @param request 当前请求
		 * @return
		 */
		public String getAppURL() {
			HttpServletRequest request = requests.get();
			if (request == null){
				return "";
			}
			StringBuffer url = new StringBuffer();
			int port = request.getServerPort();
			if (port < 0) {
				port = 80; // Work around java.net.URL bug
			}
			String scheme = request.getScheme();
			url.append(scheme);
			url.append("://");
			url.append(request.getServerName());
			if ((scheme.equals("http") && (port != 80))|| (scheme.equals("https") && (port != 443))) {
				url.append(':');
				url.append(port);
			}
			url.append(request.getContextPath());
			return url.toString();
		}
	 
	 /** 
	     * 获取当前网络ip 
	     * @param request 
	     * @return 
	     */  
	    public String getIpAddr(){  
	    	HttpServletRequest request = requests.get();
	    	
	        String ipAddress = request.getHeader("x-forwarded-for");  
	            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
	                ipAddress = request.getHeader("Proxy-Client-IP");  
	            }  
	            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
	                ipAddress = request.getHeader("WL-Proxy-Client-IP");  
	            }  
	            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
	                ipAddress = request.getRemoteAddr();  
	                if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){  
	                    //根据网卡取本机配置的IP  
	                    InetAddress inet=null;  
	                    try {  
	                        inet = InetAddress.getLocalHost();  
	                    } catch (UnknownHostException e) {  
	                        e.printStackTrace();  
	                    }  
	                    ipAddress= inet.getHostAddress();  
	                }  
	            }  
	            //对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割  
	            if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15  
	                if(ipAddress.indexOf(",")>0){  
	                    ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));  
	                }  
	            }  
	            return ipAddress;   
	    }
	    
	    /**
		 * 获取request所有参数
		 * 
		 * @param request
		 * @return
		 */
		private Map<String, Object> getRequestParam() {
			HttpServletRequest request = requests.get();
			
			Map<String, Object> map = new HashMap<>();

			Enumeration<String> enu = request.getParameterNames();
			while (enu.hasMoreElements()) {
				String paraName = enu.nextElement();
				map.put(paraName, request.getParameter(paraName));
			}
			return map;
		}
}
